package thread.unit4.learn;

import java.util.concurrent.*;

/**
 *
 * 实现多线程的方式四：线程池
 *
 好处：
 1.提高响应速度（减少了创建新线程的时间）
 2.降低资源消耗（重复利用线程池中线程，不需要每次都创建）
 3.便于线程管理
 corePoolSize：核心池的大小
 maximumPoolSize：最大线程数
 keepAliveTime：线程没有任务时最多保持多长时间后会终止

 面试题：创建多线程有几种方式？四种！
 *
 */
public class ThreadCreate4 {
    public static void main(String[] args) {
        //1.创建固定线程数量的线程池  注：Executors只是创造出线程池的工具类 并不用来对线程池进行配置管理
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        System.out.println(executorService.getClass());
        //父类引用指向子类对象 需要强转
        //通过ExecutorService接口的实现类 可以调用管理线程池属性的方法
        ThreadPoolExecutor service = (ThreadPoolExecutor) executorService;
        //通过Executor execute() 将需要执行run方法的线程子类或者实现类传入 即可
       service.setCorePoolSize(15);

        executorService.execute(new RealizeThread1()); //适用于Runnable实现类或者Thread子类
        Future t2 = executorService.submit(new RealizeThread2());//适用于 Callable的实现类

        try {
            //通过get方法拿到callable实现类run方法的返回值
            System.out.println("0-100的奇数和："+t2.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        //如果没有对线程池进行 shutdown() 线程池不会停止
        executorService.shutdown();

    }
}
class RealizeThread1 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if(i%2==0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}
class RealizeThread2 implements Callable{
    @Override
    public Object call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            if(i%2!=0){
                System.out.println(Thread.currentThread().getName()+":"+i);
                sum +=i;
            }
        }
        return sum;
    }
}
